package fiuba.algo3.algothief;

import java.util.ArrayList;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

public class Ciudad {

	private String nombre;
	private ArrayList<Lugar> lugares;
	private int coordenadaX;
	private int coordenadaY;
		
	public void agregarLugar(Lugar lugar){
		this.lugares.add(lugar);
	}

	
	public Ciudad(String nombre, int coordenadaX, int coordenadaY){
		this.nombre=nombre;
		this.coordenadaX=coordenadaX;
		this.coordenadaY=coordenadaY;
		this.lugares = new ArrayList<Lugar>();
	}
		
	
	public int getCoordenadaX(){
		return this.coordenadaX;
	}
	
	
	public int getCoordenadaY(){
		return this.coordenadaY;
	}


	public String getNombre() {
		return this.nombre;
	}
	
	
	public float distanciaA(Ciudad ciudadDestino){
		float distancia;
		float diferenciaX;
		float diferenciaY;
		diferenciaX = (this.coordenadaX-ciudadDestino.getCoordenadaX());
		diferenciaY = (this.coordenadaY-ciudadDestino.getCoordenadaY());
		distancia= (float) Math.sqrt((diferenciaX*diferenciaX)+(diferenciaY*diferenciaY));
		return distancia;
	}
	

	public ArrayList<Lugar> getLugares() {
		return lugares;
	}
	
	
	public Lugar getLugar(int posicion) {
		
		return lugares.get(posicion);
	}
	
	
	public Element serializar(Document doc) {
		Element elementoCiudad = doc.createElement("Ciudad");
		elementoCiudad.setAttribute("nombre", this.nombre);
		elementoCiudad.setAttribute("coordenadaX", Integer.toString(this.coordenadaX));
		elementoCiudad.setAttribute("coordenadaY", Integer.toString(this.coordenadaY));
		Element elementoLugares = doc.createElement("Lugares");
		elementoCiudad.appendChild(elementoLugares);
		for (Lugar lugar : this.lugares) {
			elementoLugares.appendChild(lugar.serializar(doc));
		}
		return elementoCiudad;
	}
	
	
	public static Ciudad hidratar(Node elementoCiudad) {
		Ciudad nuevaCiudad = new Ciudad("",0,0);
		nuevaCiudad.nombre = ((Element)elementoCiudad).getAttribute("nombre");
		nuevaCiudad.coordenadaX = Integer.parseInt(((Element)elementoCiudad).getAttribute("coordenadaX"));
		nuevaCiudad.coordenadaY = Integer.parseInt(((Element)elementoCiudad).getAttribute("coordenadaY"));
		return nuevaCiudad;
	}

	
	public Ciudad duplicar() {
		Ciudad devolucion=new Ciudad(this.nombre,this.coordenadaX,this.coordenadaY);
		return devolucion;
	}

	
	public static Ciudad cargar(Node elementoCiudad) {
		Ciudad nuevaCiudad = new Ciudad("",0,0);
		nuevaCiudad.nombre = ((Element)elementoCiudad).getAttribute("nombre");
		nuevaCiudad.coordenadaX = Integer.parseInt(((Element)elementoCiudad).getAttribute("coordenadaX"));
		nuevaCiudad.coordenadaY = Integer.parseInt(((Element)elementoCiudad).getAttribute("coordenadaY"));
		Element elementoLugares = (Element)((Element)elementoCiudad).getElementsByTagName("Lugares").item(0);
		for(int i=0; i<3; i++) {
			Lugar lugar = Lugar.hidratar(elementoLugares.getChildNodes().item(i));
			nuevaCiudad.agregarLugar(lugar);
		}
		return nuevaCiudad;
	}
	
}
